using System;
using System.Collections.Generic;


/// <summary>
/// 模块的管理类
/// </summary>
public class ModuleManager : Singleton_UI<ModuleManager>
{
    /// <summary>
    /// 保存注册进来的模块
    /// </summary>
    private Dictionary<string, BaseModule> dicModules = null;

    /// <summary>
    /// 复写基类的初始化方法
    /// 为保存注册模块的字典赋值
    /// </summary>
    public override void Init()
    {
        dicModules = new Dictionary<string, BaseModule>();
    }


    #region 获取模块
    /// <summary>
    /// 获取注册进字典的模块
    /// </summary>
    /// <param name="key">Key.</param>
    public BaseModule Get(string key)
    {
        if (dicModules.ContainsKey(key))//判断字典里是否存在 key 键
            return dicModules[key];//存在返回该值
        return null;
    }

    /// <summary>
    /// 获取注册模块
    /// </summary>
    /// <typeparam name="T">The 1st type parameter.</typeparam>
    public T Get<T>() where T : BaseModule
    {
        Type t = typeof(T);
        if (dicModules.ContainsKey(t.ToString()))//如果存在“t.ToString()”键
            return dicModules[t.ToString()] as T;//存在返回该值
        return null;
    }
    #endregion


    #region 根据模块的类型注册模块
    /// <summary>
    /// 注册方法，就是加到字典里面
    /// </summary>
    /// <param name="module">BaseModule</param>
    public void Register(BaseModule module)
    {
        Type t = module.GetType();
        Register(t.ToString(), module);
    }

    /// <summary>
    /// 注册方法
    /// </summary>
    /// <param name="key">Key.</param>
    /// <param name="module">Module.</param>
    public void Register(string key, BaseModule module)
    {
        if (!dicModules.ContainsKey(key))//如果保存模块的字典里没有 该键值
            dicModules.Add(key, module);//添加该键值
    }
    #endregion


    #region 注销模块
    /// <summary>
    /// 注销的方法，就是从字典里面拿出去
    /// </summary>
    /// <param name="module">Module.</param>
    public void UnRegister(BaseModule module)
    {
        Type t = module.GetType();
        UnRegister(t.ToString());
    }

    /// <summary>
    /// 注销的方法
    /// </summary>
    /// <param name="key">Key.</param>
    public void UnRegister(string key)
    {
        if (dicModules.ContainsKey(key))//如果字典里面存在该模块
        {
            BaseModule module = dicModules[key];
            module.Release();//BaseModule类里面的Release()方法，可以在子类里面进行实现，资源的释放等等
            dicModules.Remove(key);//从字典里面移除
            module = null;//制空
        }
    }

    /// <summary>
    /// 注销所有的模块
    /// </summary>
    public void UnRegisterAll()
    {
        List<string> _keyList = new List<string>(dicModules.Keys);//dictionary.Keys就是所有的keys的数组
        for (int i = 0; i < _keyList.Count; i++)
        {
            UnRegister(_keyList[i]);//注销的方法，就是从字典里面拿出去
        }
        dicModules.Clear();//移除字典里的所有的元素
    }
    #endregion
}



//C# typeof() 和 GetType()区是什么？
//1、typeof(x)中的x，必须是具体的类名、类型名称等，不可以是变量名称。 
//2、GetType()方法继承自Object，所以C#中任何对象都具有GetType()方法，它的作用和typeof()相同，返回Type类型的当前对象的类型。 


